package com.tencent.org.controller;

import com.tencent.basic.annotation.PreAuthorize;
import com.tencent.basic.util.AjaxResult;
import com.tencent.basic.util.PageList;
import com.tencent.org.domain.Department;
import com.tencent.org.query.DepartmentQuery;
import com.tencent.org.service.IDepartmentService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Api(value = "部门的API",description="部门接口") // 打在Controller对Controller做描述 - swagger
@RestController
@RequestMapping("/department") // 匹配请求url - 等于是 http://localhost:8080/dept
public class DepartmentController {

    @Autowired
    private IDepartmentService departmentService;

    /**
     * http://localhost:8080/dept + {json对象} + put
     * 接口 ： 添加或修改
     */
    @ApiOperation(value = "添加或修改" ) // 打在方法上，对方法做描述
    @PutMapping
    @PreAuthorize(name = "部门保存", sn = "department:save")
    public AjaxResult addOrUpdate(@RequestBody Department department) {
        try {
            if (department.getId() == null) {
                departmentService.save(department);
            } else {
                departmentService.update(department);
            }
            return AjaxResult.me();
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.me().setSuccess(false).setMessage("系统繁忙，请稍后再试！");
        }

    }


    /**
     *  接口 ： 删除部门
     *  http://localhost:8080/dept/1 + 无 + delete
     */
    @ApiOperation(value = "删除部门" ) // 打在方法上，对方法做描述
    @DeleteMapping("/{id}")
    @PreAuthorize(name = "删除部门", sn = "department:delete")
    public AjaxResult deleteById(@PathVariable("id") Long id) {
       /* try {
            departmentService.remove(id);
            return new AjaxResult(); // 返回一个AjaxResult对象 默认是true ，操作成功
        } catch (Exception e) {
            e.printStackTrace();
            AjaxResult result = new AjaxResult();
            result.setSuccess(false);
            result.setMessage("系统繁忙，请稍后再试！");
            return result;
        }*/
        // 链式编程 + 一个对象
        try {
            departmentService.remove(id);
            return AjaxResult.me(); // 返回一个AjaxResult对象 默认是true ，操作成功
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.me().setSuccess(false).setMessage("系统繁忙，请稍后再试！"); // 同一个AjaxResult对象 链式编程
        }
    }


    /**
     *   接口 ： 查询单个部门
     * Restuful风格的接口 - 使用url定位资源 使用http动词描述操作(get put patch post delete) - 如@GetMapping
     * @GetMapping("/{id}")  - 使用占位符 -  http://localhost:8080/dept/{id}
     * @PathVariable("id") - 取URL中占位符的值 将值赋值给方法的参数
     * http://localhost:8080/dept/1 + 无 + put
     */
    @ApiOperation(value = "查询单个部门" ) // 打在方法上，对方法做描述
    @GetMapping("/{id}")
    @PreAuthorize(name = "查询单个部门", sn = "department:getOne")
    public Department queryById(@PathVariable("id") Long id) {
        return departmentService.queryById(id);
    }


    /**
     *  接口 ： 查询所有部门
     * @GetMapping  - 和查询一个是不一样的 - http://localhost:8080/dept - 如果一样会报错 所以不允许有两个一样的
     * http://localhost:8080/dept + 无 + put
     */
    @ApiOperation(value = "查询所有部门" ) // 打在方法上，对方法做描述
    @GetMapping
    @PreAuthorize(name = "查询所有部门", sn = "department:getAll")
    public List<Department> queryAll() {
        return departmentService.queryAll();
    }


    /**
     * 接口 ： 分页查询 + 高级查询 post
     * @RequestBody - 从请求体中获取参数 前端请求只能为POST
     *                能够接收JSON格式的数据，并且能把接收到的JSON数据绑定到JAVA对象中。复杂对象包括List，实体类，Map对象等
     * 不加的时候 = http://localhost:8080/dept/username=1&age=18 这种格式 SpringMvc自动截取赋值
     * http://localhost:8080/dept + {json对象} + post
     */
    @ApiOperation(value = "分页查询" ) // 打在方法上，对方法做描述
    @PostMapping
    @PreAuthorize(name = "部门列表", sn = "department:list")
    public PageList<Department> queryPage(@RequestBody DepartmentQuery query) {
        return departmentService.queryPage(query);

    }


    /**
     *  接口 ： 批量删除部门
     *  http://localhost:8080/dept/1 + 无 + delete
     */
    @ApiOperation(value = "批量删除部门" ) // 打在方法上，对方法做描述
    @PatchMapping
    @PreAuthorize(name = "批量删除部门", sn = "department:patchDelete")
    // 前端传递过来的数组 我们既可以使用数组接收 也可以使用集合List<Long> 接收
    public AjaxResult patchDelete(@RequestBody Long[] ids) {
        try {
            departmentService.patchDelete(ids);
            return AjaxResult.me(); // 返回一个AjaxResult对象 默认是true ，操作成功
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.me().setSuccess(false).setMessage("系统繁忙，请稍后再试！"); // 同一个AjaxResult对象 链式编程
        }
    }

    /**
     *  接口 ： 部门树
     * http://localhost:8080/dept/deptTree + 无 + put
     */
    @ApiOperation(value = "部门树" ) // 打在方法上，对方法做描述
    @GetMapping("/deptTree")
    @PreAuthorize(name = "部门树", sn = "department:deptTree")
    public List<Department> queryDeptTree() {
        return departmentService.queryDeptTree();
    }
}
